#include "link.h"
//创建头节点
Plink creare()
{
	Plink p=malloc(sizeof(liink));
	if(p==NULL)
	{
		printf("申请空间失败\n");
		return NULL;
	}
	p->len=0;
	printf("创建链表成功\n");
	return p;
}
//头插法
int front_insert(Plink p,student arr)
{
	if(p==NULL)
		printf("链表异常，插入失败\n");
	Plink t=malloc(sizeof(liink));
	t->next=p->next;
	p->next=t;
	t->advice=arr;
	p->len++;
	//printf("插入完成\n");
	return 0;
}
//任意位置插入
int anypos_insert(Plink p,student arr,int n)
{
	if(p->next==NULL || p->len<n)
	{
		printf("链表异常，任意位置插入失败\n");
		return -1;
	}
	Plink t=p;
	for(int i=0;i<n;i++)
		t=t->next;
	Plink m=malloc(sizeof(liink));
	m->advice=arr;
	m->next=t->next;
	t->next=m;
	p->len++;
	printf("任意位置插入成功\n");
	return 0;
}
//任意位置删除
int anypos_delete(Plink p,int n)
{
	if(p==NULL || p->len<n)
	{
		printf("链表异常，任意位置插入失败\n");
		return -1;
	}
	Plink t=p;
	for(int i=0;i<n;i++)
		t=t->next;
	Plink t1=t->next;
	t->next=t1->next;
	free(t1);
	t1=NULL;
	p->len--;
	printf("任意位置删除成功\n");
	return 0;
}
//逆置
int link_re(Plink p)
{
	if(p==NULL || p->len<1 )
	{
		printf("链表异常，逆置失败\n");
		return -1;
	}
	Plink t=p->next;
	for(int i=0;i<p->len-1;i++)
	{

		Plink t1=t->next;
		t->next=t1->next;
		t1->next =p->next;
		p->next=t1;
	}
	printf("逆置成功\n");
	return 0;
}
//排序
int popul_sort(Plink p)
{
	if(p==NULL || p->len<1)
	{
		printf("链表异常，排序失败\n");
		return -1;
	}
	for(int i=0;i<p->len-1;i++)
	{
		Plink t=p;
		for(int m=0;m<p->len-i-1;m++)
		{
			t=t->next;
			Plink t1=t->next;
			if(t->advice.transcript>t1->advice.transcript)
			{
				student test;
				test=t->advice;
				t->advice=t1->advice;
				t1->advice=test;
			}
		}
	}
	printf("排序完成\n");
	return 0;
}
//遍历输出
int output_link(Plink p)
{
	if(p==NULL || p->len<1)
	{
		printf("链表异常，遍历失败\n");
		return -1;
	}
	Plink t=p;
	printf("节点数量%d\n",p->len);
	for(int i=0;i<p->len;i++)
	{
		t=t->next;
		printf("第%d个学生学号：%6d,\t姓名：%10s,\t成绩：%3.2f\n",i+1
				 ,t->advice.id
				 ,t->advice.name
				 ,t->advice.transcript);
	}
	return 0;
}
